Some systems have heterogeneous processors. For example, a system with a central processing unit (CPU) and multiple cores (hereinafter “CPUs” and “cores” may be used interchangeably), may also include graphical processing units (GPUs), which often include multiple cores (hereinafter “GPUs” and “cores” may be used interchangeably). The CPUs and the GPUs may share the same memory, which often includes caches. Caches are smaller portions of the memory that require less time to access than the main memory and often are privately used by one or more processors. Portions of the main memory are copied into the caches of the CPUs and GPUs. The multiple copies of the portions of main memory being used by different processors require methods for how to keep the caches and main memory consistent or coherent with one another. Often, in a heterogeneous system, data is moved between the cache of the first processor type such as the CPU and the cache of the second processor type such as the GPU.